Taller VaR y CVaR método de simulación Monte Carlo -------------------------------------------------- Importar datos. ~~~~~~~~~~~~~~~ .. code:: r datos = read.csv("Datos primer examen 01-2020.csv", sep = ";") Matriz de precios. ~~~~~~~~~~~~~~~~~~ .. code:: r precios = datos[,-1] Matriz de rendimientos. ~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r rendimientos = matrix(, nrow(precios)-1, ncol(precios)) for(i in 1:ncol(precios)){ rendimientos[,i] = diff(log(precios[,i])) } :math:`S_0:`\ Precio actual de cada acción. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r s = tail(precios,1) s = as.numeric(s) s .. raw:: html
  1. 3180
  2. 18800
  3. 24760
  4. 44700
Número de acciones del portafolio de inversión. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r numero_acciones = c(180000,5000,12000,20000) numero_acciones .. raw:: html
  1. 180000
  2. 5000
  3. 12000
  4. 20000
Valor de mercado de cada acción. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r valor_mercado_acciones = numero_acciones*s valor_mercado_acciones .. raw:: html
  1. 572400000
  2. 9.4e+07
  3. 297120000
  4. 8.94e+08
Valor de mercado del portafolio de inversión. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r valor_portafolio = sum(valor_mercado_acciones) valor_portafolio .. raw:: html 1857520000 Proporciones de inversión. ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r proporciones = valor_mercado_acciones/valor_portafolio proporciones .. raw:: html
  1. 0.308152805891727
  2. 0.0506051078857832
  3. 0.159955209095999
  4. 0.481286877126491
:math:`\mu:` Rendimiento esperado de cada acción ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r mu = apply(rendimientos, 2, mean) mu .. raw:: html
  1. 0.00052818024892044
  2. 0.000817437518458556
  3. 0.000411972791855423
  4. 0.00146604550819807
:math:`\sigma:`\ Volatilidad de cada acción ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r volatilidades = apply(rendimientos, 2, sd) volatilidades .. raw:: html
  1. 0.0384381803599016
  2. 0.030438809306807
  3. 0.0239949256781827
  4. 0.0292898506777494
Matriz de coeficientes de correlación ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r correlacion = cor(rendimientos) correlacion .. raw:: html
A matrix: 4 × 4 of type dbl
1.00000000.31506070.29603060.3571087
0.31506071.00000000.40157950.3706462
0.29603060.40157951.00000000.3298657
0.35710870.37064620.32986571.0000000
Descomposición de Cholesky ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r cholesky = chol(correlacion) cholesky .. raw:: html
A matrix: 4 × 4 of type dbl
10.31506070.29603060.3571087
00.94907150.32485640.2719872
00.00000000.89823950.1511777
00.00000000.00000000.8807052
Preguntas ~~~~~~~~~ ¿Cuál es el VaR y CVaR semanal con un nivel de confianza del 90% de cada una de las acciones y del portafolio de inversión? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ La frecuencia temporal de los rendimientos es semanal. Se usará ``dt=1/5`` porque se recomienda que :math:`\Delta t` sea pequeño. Así se podrá realizar saltos diarios en el tiempo debido a que una semana tiene cinco días bursátiles. Así con saltos diarios de tiempo, para el **VaR semanal**, ``n=5``. .. code:: r n = 5 dt = 1/5 NC = 0.90 SImulación de precios diarios ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r iteraciones = 50000 st = array(dim = c(iteraciones, n+1, ncol(rendimientos))) for(i in 1:ncol(rendimientos)){ st[,1,i] = s[i] # Con este for se está almacenando el precio actual de cada acción en la columna 1 de las matrices del array. } aleatorio_corr = vector() for(k in 1:ncol(precios)){ for(i in 1:iteraciones){ for(j in 2:(n+1)){ aleatorio = rnorm(ncol(precios)) aleatorio_corr = colSums(aleatorio*cholesky) st[i,j,k] = st[i,j-1,k]*exp((mu[k]-volatilidades[k]^2/2)*dt+volatilidades[k]*sqrt(dt)*aleatorio_corr[k]) } } } Rendimientos semanales simulados de cada acción ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ El array ``st``\ tiene seis columnas (``n+1``), la última columna tiene los precios simulados para una semana. Con esta columna se calcularán los rendimientos **semanales** simulados. .. code:: r rend = matrix(,iteraciones,ncol(rendimientos)) for(i in 1:ncol(rendimientos)){ rend[,i] = st[,n+1,i]/s[i]-1 #Rendimientos semanales simulados de cada acción. } Rendimientos semanales simulados del portafolio de inversión ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r rend_port = vector() for(i in 1:nrow(rendimientos)){ rend_port[i] = sum(rend[i,]*proporciones) } VaR semanal individuales ~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r VaR_individuales_SM_percentil = vector() for(i in 1:ncol(rendimientos)){ VaR_individuales_SM_percentil[i] = abs(quantile(rend[,i], 1-NC)*valor_mercado_acciones[i]) } VaR_individuales_SM_percentil .. raw:: html
  1. 27250682.5694049
  2. 3580028.41405506
  3. 8942544.84875934
  4. 32208722.325042
VaR semanal del portafolio de inversión ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r VaR_portafolio_SM_percentil = abs(quantile(rend_port, 1-NC)*valor_portafolio) VaR_portafolio_SM_percentil .. raw:: html 10%: 43906650.7840915 CVaR semanal individuales ~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r CVaR = vector() for(i in 1:ncol(rendimientos)){ CVaR[i] = abs(mean(tail(sort(rend[,i], decreasing = T), floor(nrow(rend)*(1-NC))))*valor_mercado_acciones[i]) } CVaR .. raw:: html
  1. 37265944.1349686
  2. 4850952.504194
  3. 12231487.8941014
  4. 43807904.8354661
CVaR semanal del portafolio de inversión ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r CVaR_portafolio = abs(mean(tail(sort(rend_port, decreasing = T), floor(nrow(rend)*(1-NC))))*valor_portafolio) CVaR_portafolio .. raw:: html 481061.470750188 ¿Cuál es el VaR y CVaR mensual con un nivel de confianza del 95% de cada una de las acciones y del portafolio de inversión? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ La frecuencia temporal de los rendimientos es semanal. Se usará ``dt=1/5`` porque se recomienda que :math:`\Delta t` sea pequeño. Así se podrá realizar saltos diarios en el tiempo debido a que una semana tiene cinco días bursátiles. Así con saltos diarios de tiempo, para el **VaR mensual**, ``n=20``. .. code:: r n = 20 dt = 1/5 NC = 0.95 .. code:: r iteraciones = 50000 st = array(dim = c(iteraciones, n+1, ncol(rendimientos))) for(i in 1:ncol(rendimientos)){ st[,1,i] = s[i] # Con esto for se está almacenando el precio actual de cada acción en la columna 1 de las matrices del array. } aleatorio_corr = vector() for(k in 1:ncol(precios)){ for(i in 1:iteraciones){ for(j in 2:(n+1)){ aleatorio = rnorm(ncol(precios)) aleatorio_corr = colSums(aleatorio*cholesky) st[i,j,k] = st[i,j-1,k]*exp((mu[k]-volatilidades[k]^2/2)*dt+volatilidades[k]*sqrt(dt)*aleatorio_corr[k]) } } } Rendimientos mensuales simulados de cada acción ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ El array ``st``\ tiene 21 columanas (``n+1``), la última columna tiene los precios simulados para un mes. Con esta columna se calcularán los rendimientos **mensuales** simulados. .. code:: r rend = matrix(, iteraciones, ncol(rendimientos)) for(i in 1:ncol(rendimientos)){ rend[,i] = st[,n+1,i]/s[i]-1 #Rendimientos mensuales simulados de cada acción. } Rendimientos mensuales simulados del portafolio de inversión ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r rend_port = vector() for(i in 1:nrow(rendimientos)){ rend_port[i] = sum(rend[i,]*proporciones) } VaR mensual individuales ~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r VaR_individuales_SM_percentil = vector() for(i in 1:ncol(rendimientos)){ VaR_individuales_SM_percentil[i] = abs(quantile(rend[,i], 1-NC)*valor_mercado_acciones[i]) } VaR_individuales_SM_percentil .. raw:: html
  1. 68425768.9393525
  2. 8715863.30371035
  3. 22371602.2623771
  4. 78647023.9143117
VaR mensual del portafolio de inversión ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r VaR_portafolio_SM_percentil = abs(quantile(rend_port, 1-NC)*valor_portafolio) VaR_portafolio_SM_percentil .. raw:: html 5%: 109628306.897354 CVaR mensual individuales ~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r CVaR = vector() for(i in 1:ncol(rendimientos)){ CVaR[i] = abs(mean(tail(sort(rend[,i], decreasing = T), floor(nrow(rend)*(1-NC))))*valor_mercado_acciones[i]) } CVaR .. raw:: html
  1. 84333805.7509863
  2. 10876579.5113407
  3. 27763643.9843417
  4. 98184468.4514079
CVaR mensual del portafolio de inversión ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r CVaR_portafolio = abs(mean(tail(sort(rend_port, decreasing = T), floor(nrow(rend)*(1-NC))))*valor_portafolio) CVaR_portafolio .. raw:: html 6043185.3876385 ¿Cuál es el VaR y CVaR diario con un nivel de confianza del 99% de cada una de las acciones y del portafolio de inversión? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Como anteriormente se hallaron los precios simulados para 20 días (un mes), no es necesario volverlos a calcularlos porque solo se necesitan los precios simulados del día uno para obtener los rendimientos simulados diarios. Estos valores están en la columna 2 del array ``st``.** .. code:: r NC = 0.99 Rendimientos diarios simulados de cada acción ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``st[,2,i]``\ son los precios simulados de cada acción para el día uno. .. code:: r rend = matrix(, iteraciones, ncol(rendimientos)) for(i in 1:ncol(rendimientos)){ rend[,i] = st[,2,i]/s[i]-1 #Rendimientos simulados de cada acción para el día 1. } Rendimientos diarios simulados del portafolio de inversión ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r rend_port = vector() for(i in 1:nrow(rendimientos)){ rend_port[i] = sum(rend[i,]*proporciones) } VaR diario individuales ~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r VaR_individuales_SM_percentil = vector() for(i in 1:ncol(rendimientos)){ VaR_individuales_SM_percentil[i] = abs(quantile(rend[,i], 1-NC)*valor_mercado_acciones[i]) } VaR_individuales_SM_percentil .. raw:: html
  1. 22434687.8014924
  2. 2919082.71606842
  3. 7386222.59359142
  4. 26246899.3793198
VaR diario portafolio de inversión ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r VaR_portafolio_SM_percentil = abs(quantile(rend_port, 1-NC)*valor_portafolio) VaR_portafolio_SM_percentil .. raw:: html 1%: 36446602.6033561 CVaR diario individuales ~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r CVaR = vector() for(i in 1:ncol(rendimientos)){ CVaR[i] = abs(mean(tail(sort(rend[,i], decreasing = T), floor(nrow(rend)*(1-NC))))*valor_mercado_acciones[i]) } CVaR .. raw:: html
  1. 25585202.4378887
  2. 3353496.1402176
  3. 8392179.62141718
  4. 29944435.6810667
CVaR diario portafolio de inversión ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: r CVaR_portafolio = abs(mean(tail(sort(rend_port, decreasing = T), floor(nrow(rend)*(1-NC))))*valor_portafolio) CVaR_portafolio .. raw:: html 1322962.98293428